﻿/**
 * 
 * @file FITKSEASubSysGeoProp.h
 * @brief SEA子系统几何属性计算
 * @author LiBaojun (libaojunqd@foxmail.com)
 * @date 2024-11-05
 * 
 */
#ifndef _FITK_SEASUB_SYS_GEOPROP_H___
#define _FITK_SEASUB_SYS_GEOPROP_H___
 
#include "FITKAcousticsModelAPI.h"
#include <QList>
#include <QPair>
#include <QHash>

namespace Core
{
    class FITKNode;
}

namespace Acoustics
{
    class FITKAbstractSEASubSys;
    /**
     * @brief 子系统的几何属性计算
     * @author LiBaojun (libaojunqd@foxmail.com)
     * @date 2024-11-05
     */
    class FITKAcousticsModelAPI FITKSEASubSysGeoProp
    {
    public:
        /**
          * @brief 几何属性类型
          * @author LiBaojun (libaojunqd@foxmail.com)
          * @date 2024-10-06
          */
        enum GeoPropType
        {
            Circumference,  ///< 周长 -梁的长度
            Area,           ///< 面积
            Volume,         ///< 体积
            Length,         ///< 长
            Width,          ///< 宽
            RadiusR1,       ///< 曲率半径1
            RadiusR2,       ///< 曲率半径2
            Angle,          ///< 角度:指定双曲面壳体的局部X轴与第一曲率半径R1之间的夹角
        };
    public:
        /**
         * @brief Construct a new FITKSEASubSysGeoProp object
         * @param[i]  subsys        子系统对象
         * @author LiBaojun (libaojunqd@foxmail.com)
         * @date 2024-11-05
         */
        explicit FITKSEASubSysGeoProp(FITKAbstractSEASubSys* subsys);
        /**
         * @brief Destroy the FITKSEASubSysGeoProp object
         * @author LiBaojun (libaojunqd@foxmail.com)
         * @date 2024-11-05
         */
        virtual ~FITKSEASubSysGeoProp() = default;
        /**
         * @brief 更新几何属性
         * @param[i]  noUpdateType 不需要更新的类型
         * @return true   更新成功
         * @return false   更新失败
         * @author LiBaojun (libaojunqd@foxmail.com)
         * @date 2024-11-05
         */
        bool updateProp(QList<GeoPropType> noUpdateType = QList<GeoPropType>());
        /**
         * @brief 获取几何属性
         * @param[i]  t          几何属性类型
         * @return double 
         * @author LiBaojun (libaojunqd@foxmail.com)
         * @date 2024-11-05
         */
        double getGeoProp(GeoPropType t);
        /**
         * @brief    设置几何属性
         * @param[i] t 
         * @param[i] value 
         * @return   void
         * @author   liuzhonghua (liuzhonghuaszch@163.com)
         * @date     2025-01-16
         */
        void setGeoProp(GeoPropType t, double value);
        /**
         * @brief 获取板朝向声腔的方向
         * @param[i]  shellid          板id
         * @return int  0-错误值   >0正向朝向声腔  <0负向朝向声腔
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date     2024-11-13
         */
        int getShellDirOnCavity(const int shellid);
        /**
         * @brief    获取边界节点id对
         * @return   QList<QPair<int,int>>
         * @author   liuzhonghua (liuzhonghuaszch@163.com)
         * @date     2024-11-13
         */
        QList<QPair<int, int>> getBoundary();

    private:
        /**
         * @brief 计算梁属性
         * @author LiBaojun (libaojunqd@foxmail.com)
         * @date 2024-11-05
         */
        void calculateBeamProp(QList<GeoPropType> noUpdateType);
        /**
         * @brief 计算板属性 - 计算周长和面积
         * @author LiBaojun (libaojunqd@foxmail.com)
         * @date 2024-11-05
         */
        void calculateShellProp(QList<GeoPropType> noUpdateType);
        /**
         * @brief 计算板属性长宽 -必须计算完周长和面积才能调用
         * @param nodeList
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-11-07
         */
        void calcShellPropLengthWidth(QList<Core::FITKNode*>& nodeList);
        /**
         * @brief 计算声腔属性 - 体积
         * @author LiBaojun (libaojunqd@foxmail.com)
         * @date 2024-11-05
         */
        void calculateCavityProp(QList<GeoPropType> noUpdateType);
        /**
         * @brief    计算板的方向
         * @return   void
         * @author   liuzhonghua (liuzhonghuaszch@163.com)
         * @date     2024-11-14
         */
        void calculateShellDir();
        /**
         * @brief    获取板的方向
         * @param[i] shellID
         * @return   int
         * @author   LiBaojun (libaojunqd@foxmail.com)
         * @date 2024-11-05
         */
        int getShellDir(int shellID);

    private:
        /**
         * @brief 几何属性  周长 面积  体积 长 宽 曲率半径1 曲率半径2 角度
         * @author LiBaojun (libaojunqd@foxmail.com)
         * @date 2024-11-05
         */ 
        double _geoprop[8] = { 0,0,0,0,0,0,0,0 };
        /**
         * @brief  板的方向 shellID, dir>0正向朝向声腔  <0负向朝向声腔
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date   2024-11-14
         */
        QHash<int, int> _shellDir{};
        /**
         * @brief  SEA子系统的数据对象
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date   2024-11-19
         */
        FITKAbstractSEASubSys* _subSys{};
    };
}


#endif
